<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 浅拷贝时 引用类型只拷贝堆地址 操作时会互相影响 
        // var obj = {
        //     id: 1,
        //     name: 'andy'
        // }
        // var o = {

        // }
        // // 浅拷贝原生写法
        // for (var k in obj) {
        //     o[k] = obj[k]
        // }
        // console.log(o);
        // 浅拷贝语法糖  Object.assign(目标对象,待拷贝对象)
        // Object.assign(o,obj)

        // 深拷贝时 深拷贝后修改数据不会影响原对象内的数据 地址是不同的
        //先判断属性值的数据类型 
        //递归循环判断
        //最后在统一赋值
        var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 20,
                sex: '男'
            },
            color: [
                'pink', 'blue'
            ]
        }
        var o = {
        }
        function deepCopy(newObj, oldObj) {
            for (var k in oldObj) {
                // var item = oldObj[k]
                // 数组也属于Object 为避免与对象数据添加到一起 所以必须先把属于数组的数据先筛选出来 
                if (oldObj[k] instanceof Array) {
                    newObj[k] = []
                    deepCopy(newObj[k], oldObj[k])
                } else if (oldObj[k] instanceof Object) {
                    newObj[k] = {}
                    deepCopy(newObj[k], oldObj[k])
                } else {
                    newObj[k] = oldObj[k]
                }
            }
        }
        deepCopy(o, obj)
        console.log(o);
        o.sex = '女'
        console.log(obj);//sex = 男 深拷贝不会影响原对象内的数据 地址是不同的

    </script>
</body>

</html>